package chaoyue.study.pool;

import chaoyue.study.ThreadUtils;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 使用原生的方式去创建和使用线程池
 */
public class ThreadPoolTest2 {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                10,// 核心线程数
                25, // 最大线程数
                10L, // 线程存活时间
                TimeUnit.SECONDS, // 线程存活时间单位
                new LinkedBlockingQueue<>(), // 工作队列（阻塞队列）
                new MyThreadFactory(), // 线程工厂 用来生产线程
                new ThreadPoolExecutor.AbortPolicy()); // 拒绝策略 无法再处理提交到核心线程中时处理方式

        // 提交任务到线程池
        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            threadPool.execute(() -> {
                ThreadUtils.sleepRandom(2000);
                System.out.println(Thread.currentThread().getName() + ":task-" + taskId);
            });
        }

        // 关闭线程池
        threadPool.shutdown();
    }

    /**
     * 自定义线程工厂
     * 线程工厂就是用来生产线程池中的线程的
     */
    private static class MyThreadFactory implements ThreadFactory {
        private final AtomicInteger count = new AtomicInteger(1);

        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r);
            thread.setName("myThread-" + count.getAndIncrement());
            return thread;
        }
    }
}
